#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys

sys.path.append('..')
from common_utils import CBBCommonUtils


def get_plugin_info():
    plugin_info = {
        "name": "centos_access_control_009 Disable_crtl-alt-del_key",
        "plugin_id": "centos_access_control_009",
        "plugin_type": "Access Control",
        "info": "Check and disable crtl-alt-del key",
        "level": "C",
        "module": "Safety reinforcement",
        "author": "fanyi",
        "keyword": "Safety reinforcement",
        "configable": "false"
    }
    return plugin_info


logger = None
cur_user = None
cur_module = None
cur_task = None


def set_plugin_logger(setter, user, module, task, *args, **kwargs):
    global logger, cur_user, cur_module, cur_task
    logger = setter
    cur_user = user
    cur_module = module
    cur_task = task


# 扫描函数
def scan(ip, sys_user, sys_pwd, flag=0):
    des_list = []
    error_count = 0
    logger.debug_info(cur_user, cur_module, cur_task+'_Scan', '', "Scan Start.")
    # 获取当前状态
    cmd = "ls /usr/lib/systemd/system/ | grep ctrl-alt-del.target"
    result, output = CBBCommonUtils.cbb_run_cmd(ip, cmd, username=sys_user, passwd=sys_pwd)
    # 检错，每次执行命令都会进行检错，并决定返回退出/继续执行
    if not result and len(output) == 0:
        des_list.append("safe")
        logger.debug_info(cur_user, cur_module, cur_task+'_Scan', '', "It is safe.")
        return des_list, error_count
    elif not result and len(output) != 0:
        error_count += 1
        des_list.append("shortcut not disabled")
        logger.debug_warning(cur_user, cur_module, cur_task+'_Scan', '', "Shortcut not disabled.")
    else:
        error_des = "CMD process ERROR. Error info: {}".format(result[0].replace("\n", ""))
        des_list.append(error_des)
        logger.debug_error(cur_user, cur_module, cur_task+'_Scan', '', error_des)
        error_count += 1
        return des_list, error_count
    des_list.append("Scan Complete.")
    logger.debug_info(cur_user, cur_module, cur_task+'_Scan', '', "Scan Complete.")
    # 是否加固
    if flag == 1:
        reinforce_des, reinforce_err = reinforce(ip, sys_user, sys_pwd)
        if reinforce_err == 0:
            error_count = 0
            des_list.extend(reinforce_des)
        else:
            error_count += 1
            des_list.extend(reinforce_des)
    return des_list, error_count


# 加固函数
def reinforce(ip, sys_user, sys_pwd):
    des_list = []
    error_count = 0
    logger.debug_info(cur_user, cur_module, cur_task+'_Reinforce', '', "Reinforce Start.")
    # 删除软连接文件
    safe_cmd = "rm -rf /usr/lib/systemd/system/ctrl-alt-del.target"
    result, output = CBBCommonUtils.cbb_run_cmd(ip, safe_cmd, username=sys_user, passwd=sys_pwd)
    if not result:
        # 检查
        check_cmd = "ls /usr/lib/systemd/system/ | grep ctrl-alt-del.target"
        result, output = CBBCommonUtils.cbb_run_cmd(ip, check_cmd, username=sys_user, passwd=sys_pwd)
        if not result and len(output) == 0:
            restart_cmd = "init q"
            result, output = CBBCommonUtils.cbb_run_cmd(ip, restart_cmd, username=sys_user, passwd=sys_pwd)
            if not result:
                des_list.append("Reinforce Complete.")
                logger.debug_info(cur_user, cur_module, cur_task+'_Reinforce', '', "Reinforce Complete.")
            else:
                des_list.append("Reinforce Succeed, but you need to reload init daemon configuration")
                logger.debug_info(cur_user, cur_module, cur_task+'_Reinforce', '', "Reinforce Succeed, but you need to reload init daemon configuration.")
        elif not result and len(output) != 0:
            error_count += 1
            des_list.append("Reinforce ERROR")
            logger.debug_error(cur_user, cur_module, cur_task+'_Reinforce', '', "Reinforce Error.")
        else:
            error_count += 1
            des_list.append("Reinforce Failed.")
            logger.debug_error(cur_user, cur_module, cur_task+'_Reinforce', '', "Reinforce Failed.")
            # 加固失败，回滚
            rollback_des, rollback_err = rollback(ip, sys_user, sys_pwd)
            if rollback_err == 0:
                des_list.extend(rollback_des)
            else:
                error_count += 1
                des_list.extend(rollback_des)
            return des_list, error_count
    else:
        error_count += 1
        des_list.append("Reinforce Failed.")
        logger.debug_error(cur_user, cur_module, cur_task+'_Reinforce', '', "Reinforce Failed.")
        return des_list, error_count
    return des_list, error_count


# 回滚函数
def rollback(ip, sys_user, sys_pwd):
    des_list = []
    error_count = 0
    logger.debug_info(cur_user, cur_module, cur_task+'_Rollback', '', "Rollback Start.")
    cmd = "ls /usr/lib/systemd/system/ | grep ctrl-alt-del.target"
    result, output = CBBCommonUtils.cbb_run_cmd(ip, cmd, username=sys_user, passwd=sys_pwd)
    # 检查是否需要rollback
    if not result and len(output) == 0:
        cmd = "ln -s /usr/lib/systemd/system/reboot.target /usr/lib/systemd/system/ctrl-alt-del.target"
    elif not result and len(output) != 0:
        des_list.append("Don't need to Rollback.")
        logger.debug_info(cur_user, cur_module, cur_task+'_Rollback', '', "Don't need to Rollback.")
        return des_list, error_count
    else:
        error_des = "Check ERROR. Error info: {}".format(result[0].replace("\n", ""))
        des_list.append(error_des)
        logger.debug_error(cur_user, cur_module, cur_task+'_Rollback', '', error_des)
        error_count += 1
        return des_list, error_count
    # 回滚文件
    result, output = CBBCommonUtils.cbb_run_cmd(ip, cmd, username=sys_user, passwd=sys_pwd)
    if not result:
        restart_cmd = "init q"
        result, output = CBBCommonUtils.cbb_run_cmd(ip, restart_cmd, username=sys_user, passwd=sys_pwd)
        if not result:
            des_list.append("Rollback Complete.")
            logger.debug_info(cur_user, cur_module, cur_task+'_Rollback', '', "Rollback Complete.")
        else:
            des_list.append("Rollback Complete, but you need to reload init daemon configuration")
            logger.debug_info(cur_user, cur_module, cur_task+'_Rollback', '', "Rollback Complete, but you need to reload init daemon configuration.")
        return des_list, error_count
    else:
        error_count += 1
        des = "Rollback FAILED, please retry."
        des_list.append(des)
        logger.debug_error(cur_user, cur_module, cur_task+'_Rollback', '', des)
        return des_list, error_count


def check(ip, *args, **kwargs):
    sys_user = kwargs.get("system_user")
    sys_pwd = kwargs.get("system_pwd")
    comm = kwargs.get("command")
    try:
        des_list = []
        logger.debug_info(cur_user, cur_module, cur_task+'_Check', '', "centos_access_control_009 Start")
        if comm == 1:
            des_scan, error_scan = scan(ip, sys_user, sys_pwd, flag=0)
            des_list.extend(des_scan)
            step_error = int(error_scan)
        elif comm == 2:
            des_reinforce, error_reinforce = scan(ip, sys_user, sys_pwd, flag=1)
            des_list.extend(des_reinforce)
            step_error = int(error_reinforce)
        elif comm == 3:
            des_rollback, error_rollback = rollback(ip, sys_user, sys_pwd)
            des_list.extend(des_rollback)
            step_error = int(error_rollback)
        else:
            return {"code": 3, "count": 0, "des": ['command must be 1/2/3']}
        logger.debug_info(cur_user, cur_module, cur_task+'_Check', '', "centos_access_control_009 Complete")
        if step_error == 0:
            code = 0
        elif step_error <= -1:
            code = 2
        else:
            code = 1
        return {"code": code, "count": step_error, "des": des_list}
    except Exception as er:
        code = 1
        des = ["ERROR:", str(er)]
        logger.debug_error(cur_user, cur_module, cur_task+'_Check', '', des)
        return {"code": code, "count": 0, "des": des}


#check(ip="100.2.91.150", system_user="root", system_pwd="admin", command=0, flag=0)
